// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: braces fieldsfirst space lnc
package com.google.zxing.common;
import com.google.zxing.Binarizer;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
// Referenced classes of package com.google.zxing.common:
// BitMatrix, BitArray
public class GlobalHistogramBinarizer extends Binarizer
{
private static final int a = 5;
private static final int b = 3;
private static final int c = 32;
private byte d[];
private final int e[] = new int[32];
public GlobalHistogramBinarizer(LuminanceSource luminancesource)
{
super(luminancesource);
d = new byte[0];
}
private static int a(int ai[])
{
int i = 0;
int j = ai.length;
int k = 0;
int l = 0;
int i1 = 0;
int j1 = 0;
for (; k < j; k++)
{
if (ai[k] > l)
{
l = ai[k];
i1 = k;
}
if (ai[k] > j1)
{
j1 = ai[k];
}
}
int k1 = 0;
int l1 = 0;
while (i < j)
{
int l3 = i - i1;
int i4 = l3 * (l3 * ai[i]);
int i2;
int j2;
int k2;
int l2;
int i3;
int j3;
int k3;
int j4;
if (i4 > k1)
{
j4 = i;
} else
{
i4 = k1;
j4 = l1;
}
i++;
l1 = j4;
k1 = i4;
}
if (i1 > l1)
{
i2 = l1;
l1 = i1;
} else
{
i2 = i1;
}
if (l1 - i2 <= j >> 4)
{
throw NotFoundException.getNotFoundInstance();
}
j2 = l1 - 1;
k2 = -1;
l2 = l1 - 1;
while (l2 > i2)
{
i3 = l2 - i2;
j3 = i3 * i3 * (l1 - l2) * (j1 - ai[l2]);
if (j3 > k2)
{
k3 = l2;
} else
{
j3 = k2;
k3 = j2;
}
l2--;
j2 = k3;
k2 = j3;
}
return j2 << 3;
}
private void a(int i)
{
if (d.length < i)
{
d = new byte[i];
}
for (int j = 0; j < 32; j++)
{
e[j] = 0;
}
}
public Binarizer createBinarizer(LuminanceSource luminancesource)
{
return new GlobalHistogramBinarizer(luminancesource);
}
public BitMatrix getBlackMatrix()
{
LuminanceSource luminancesource = getLuminanceSource();
int i = luminancesource.getWidth();
int j = luminancesource.getHeight();
BitMatrix bitmatrix = new BitMatrix(i, j);
a(i);
int ai[] = e;
for (int k = 1; k < 5; k++)
{
byte abyte1[] = luminancesource.getRow((j * k) / 5, d);
int l1 = (i << 2) / 5;
for (int i2 = i / 5; i2 < l1; i2++)
{
int j2 = (0xff & abyte1[i2]) >> 3;
ai[j2] = 1 + ai[j2];
}
}
int l = a(ai);
byte abyte0[] = luminancesource.getMatrix();
for (int i1 = 0; i1 < j; i1++)
{
int j1 = i1 * i;
for (int k1 = 0; k1 < i; k1++)
{
if ((0xff & abyte0[j1 + k1]) < l)
{
bitmatrix.set(k1, i1);
}
}
}
return bitmatrix;
}
public BitArray getBlackRow(int i, BitArray bitarray)
{
int j = 1;
LuminanceSource luminancesource = getLuminanceSource();
int k = luminancesource.getWidth();
byte abyte0[];
int ai[];
if (bitarray == null || bitarray.getSize() < k)
{
bitarray = new BitArray(k);
} else
{
bitarray.clear();
}
a(k);
abyte0 = luminancesource.getRow(i, d);
ai = e;
for (int l = 0; l < k; l++)
{
int j2 = (0xff & abyte0[l]) >> 3;
ai[j2] = 1 + ai[j2];
}
int i1 = a(ai);
int j1 = 0xff & abyte0[0];
int k1 = 0xff & abyte0[j];
int l1 = j1;
while (j < k - 1)
{
int i2 = 0xff & abyte0[j + 1];
if ((k1 << 2) - l1 - i2 >> 1 < i1)
{
bitarray.set(j);
}
j++;
l1 = k1;
k1 = i2;
}
return bitarray;
}
}